#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
// #define SIGSUSPEND
#define PAUSE
// 自定义信号处理函数
void signal_handler(int sig)
{
    std::cout << "Recevied signal " << sig << std::endl;
}
int main()
{
    pid_t pid;
    // 设置信号处理函数
    signal(SIGUSR1, signal_handler);
    signal(SIGUSR2, signal_handler);
    // 创建子进程
    pid = fork();
    if (pid == -1)
    {
        perror("fork error");
        return 1;
    }
    if (pid == 0)
    {
        // 子进程
#ifdef SIGSUSPEND
        sigset_t newmask, oldmask, waitmask;
        //newmask 要屏蔽的信号集
        //oldmask 备份原屏蔽字
        //waitmask 临时解除屏蔽的集合
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGUSR1);
        sigaddset(&newmask, SIGUSR2);
        //构造信号集 假如1和2

        // 先屏蔽SIGUSR1 SIGUSR2
        sigprocmask(SIG_BLOCK, &newmask, &oldmask);

        // 等待SIGUSR1
        waitmask = oldmask;
        sigdelset(&waitmask, SIGUSR1);
        std::cout << "Child waiting for SIGUSR1...\n";
        sigsuspend(&waitmask);

        waitmask = oldmask;
        sigdelset(&waitmask, SIGUSR2);
        std::cout << "Child waiting for SIGUSR2...\n";
        sigsuspend(&waitmask);

        sigprocmask(SIG_SETMASK, &oldmask, NULL);
        std::cout << "Child exiting." << std::endl;
#endif
#ifdef PAUSE
        std::cout << "Child is waitint for signal..." << std::endl;
        pause(); // 等待信号
        std::cout << "Child exiting." << std::endl;
#endif
    }
    else
    {
        // 父进程
        sleep(1);
        kill(pid, SIGUSR1); // 发送信号给子进程
        std::cout << "Parent sending signal 1 to child." << std::endl;
#ifdef SIGSUSPEND
        sleep(1);
        kill(pid, SIGUSR2); // 发送信号给子进程
        std::cout << "Parent sending signal 2 to child." << std::endl;
#endif
        wait(NULL);
    }
    return 0;
}